(function () { if (!window.cet || !window.cet.microservices || !window.cet.microservices.apiready) { window.cet = window.cet || {}; cet.microservices = cet.microservices || {}; let apiready = new Promise(function (resolve, reject) { var scriptElement = document.createElement("script"); scriptElement.addEventListener('load', resolve); scriptElement.addEventListener('error', reject); var origin = document.currentScript.src.split('/', 3).join('/'); scriptElement.src = origin + "/provider/ApiProvider.js?8dc3063ff20c100"; document.head.appendChild(scriptElement); }); cet.microservices.apiready = apiready; } let selfUrl = document.currentScript.src; cet.microservices.apiready.then(() => { cet.microservices.api.system.addService(selfUrl); }); })(); window.cet = window.cet || {}; window.cet.microservices = window.cet.microservices || {}; cet.microservices.activityapi = (function () { // in order to call 'safe' api safely, make sure accessmanagement is loaded: var safeApiReady = cet.microservices.apiready.then(() => { if (cet.accessmanagement) return Promise.resolve(); else return cet.microservices.api.loadApi("/accessmngapi/provider/accessmanagement.js"); }); const settings = { apiUrl: "/activityapi/", retryMaxSeconds: 10 }; const isDevEnvironment = (location.host.indexOf('.dev') > 0 || location.host.indexOf('.testing') > 0); const sleep = (timeout) => { return new Promise(resolve => { setTimeout(() => { resolve(); }, timeout); }); }; /*------------------------------------------------------------------------------*/ /* Build URL query from the given payload object. */ const buildQueryFromPayload = function (payload) { if (payload && typeof payload === 'object') { var str = []; for (var p in payload) { if (payload.hasOwnProperty(p)) { if (Array.isArray(payload[p])) { for (var i = 0; i < payload[p].length; i++) { str.push(encodeURIComponent(p) + "=" + encodeURIComponent(payload[p][i])); } } else { str.push(encodeURIComponent(p) + "=" + encodeURIComponent(payload[p])); } } } return str.length > 0 ? '?' + str.join('&') : ''; } return ''; }; /*------------------------------------------------------------------------------*/ /* Validate single parameter. */ const validateParameter = function (pName, pValue) { if (!pValue || (typeof pValue === 'string' && pValue.trim().length === 0) || (Array.isArray(pValue) && pValue.length === 0)) { return pName + ' cannot be empty'; } return ''; }; /*------------------------------------------------------------------------------*/ /* Validate request object. */ const validateRequest = function (request, relevantParameters) { if (!request) { return 'request data is missing'; } for (var i = 0; i < relevantParameters.length; i++) { var param = relevantParameters[i]; var paramParts = param.split('.'); var subRequest = request; if (paramParts.length > 1) { for (var p = 0; p < paramParts.length - 1; p++) { subRequest = subRequest && subRequest[paramParts[p]]; param = paramParts[p + 1]; if (subRequest && typeof subRequest === 'string') { try { subRequest = JSON.parse(subRequest); } catch (e) { subRequest = null; } } } } if (!subRequest || !subRequest.hasOwnProperty(param)) { return relevantParameters[i] + ' is missing'; } else { var error = validateParameter(relevantParameters[i], subRequest[param]); if (error) { return error; } } } return ''; }; /*------------------------------------------------------------------------------*/ const processRequest = (request, tryIndex = 0) => { var promise = new Promise(function (resolve, reject) { var validationErrorMsg = request.validationParams ? validateRequest(request.data, request.validationParams) : ''; if (validationErrorMsg) { isDevEnvironment && alert(validationErrorMsg); reject({ 'name': 'ProviderValidationError', 'message': validationErrorMsg }); } else { safeApiReady.then(async () => { try { var result = null; if (request.type === 'get') { result = await cetms.safe.get(request.URL + buildQueryFromPayload(request.data)); } else if (request.type === 'post') { result = await cetms.safe.post(request.URL, request.data); } resolve(result); } catch (error) { let retrySleepMs = 0; if (error.name === 'ConnectivityError') { // Network Error retrySleepMs = 200; } else if (error.name === 'ApiError') { // API Error (4XX, 5XX, ...) const errorMsg = error.message ? error.message.toLowerCase() : ''; if (errorMsg.indexOf('status 502') > -1 || errorMsg.indexOf('status 503') > -1) { retrySleepMs = 750; } } let retryMax = retrySleepMs > 0 ? (settings.retryMaxSeconds * 1000) / retrySleepMs : 0; if (tryIndex < retryMax) { await sleep(retrySleepMs); try { let result = await processRequest(request, ++tryIndex); resolve(result); } catch (error) { reject(error); } } else { reject(error); } } }).catch(error => { reject(error); }); } }); return promise; }; /*------------------------------------------------------------------------------*/ const sendActivity = async (requestData) => { return processRequest({ type: 'post', URL: settings.apiUrl + 'Activity/Send', data: requestData, validationParams: ['applicationId', 'studentId', 'action', 'actionData.schoolId', 'actionData.structureId', 'actionData.sessionId', 'actionData.contentLanguage', 'actionData.categoryId'] }); }; /*------------------------------------------------------------------------------*/ const getActivities = (requestData) => { return processRequest({ type: 'post', URL: settings.apiUrl + 'Activity/Get', data: requestData, validationParams: ['applicationId'] }); }; /*------------------------------------------------------------------------------*/ const createActivityTrigger = (requestData) => { return processRequest({ type: 'post', URL: settings.apiUrl + 'ActivityTrigger/Create', data: requestData, validationParams: ['applicationId', 'activity', 'trigger'] }); }; /*------------------------------------------------------------------------------*/ const deleteActivityTrigger = (requestData) => { return processRequest({ type: 'post', URL: settings.apiUrl + 'ActivityTrigger/Delete', data: requestData, validationParams: ['applicationId', 'activity', 'trigger'] }); }; const attachApplication = (requestData) => { return processRequest({ type: 'post', URL: settings.apiUrl + 'ActivityTrigger/AttachApplication', data: requestData, validationParams: ['targetApplicationId', 'sourceApplicationId'] }); }; return { 'activity': { send: sendActivity, get: getActivities }, 'activityTrigger': { create: createActivityTrigger, delete: deleteActivityTrigger, attachApplication: attachApplication } }; })();